home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / glibmm-2.4 / proc / pm / Enum.pm < prev    next >
Text File  |  2006-04-20  |  5KB  |  225 lines

  1. package Enum;
  2.  
  3. use strict;
  4. use warnings;
  5.  
  6. BEGIN {
  7.      use Exporter   ();
  8.      our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS);
  9.  
  10.      # set the version for version checking
  11.      $VERSION     = 1.00;
  12.      @ISA         = qw(Exporter);
  13.      @EXPORT      = ( );
  14.      %EXPORT_TAGS = ( );
  15.      # your exported package globals go here,
  16.      # as well as any optionally exported functions
  17.      @EXPORT_OK   = ( );
  18.      }
  19. our @EXPORT_OK;
  20.  
  21. # class Enum
  22. #    {
  23. #       bool flags;
  24. #       string type;
  25. #       string module;
  26. #       string c_type;
  27. #
  28. #       string array elem_names;
  29. #       string array elem_values;
  30. #
  31. #       bool mark;
  32. #    }
  33.  
  34.  
  35. sub new
  36. {
  37.   my ($def) = @_;
  38.   my $self = {};
  39.   bless $self;
  40.  
  41.   $def =~ s/^\(//;
  42.   $def =~ s/\)$//;
  43.  
  44.   $$self{mark}  = 0;
  45.   $$self{flags} = 0;
  46.  
  47.   $$self{elem_names}  = [];
  48.   $$self{elem_values} = [];
  49.  
  50.   # snarf down the fields
  51.  
  52.   if($def =~ s/^define-(enum|flags)-extended (\S+)//)
  53.   {
  54.     $$self{type} = $2;
  55.     $$self{flags} = 1 if($1 eq "flags");
  56.   }
  57.  
  58.   $$self{module} = $1 if($def =~ s/\(in-module "(\S+)"\)//);
  59.   $$self{c_type} = $1 if($def =~ s/\(c-name "(\S+)"\)//);
  60.  
  61.   # values are compound lisp statement
  62.   if($def =~ s/\(values((?: '\("\S+" "\S+" "[^"]+"\))*) \)//)
  63.   {
  64.     $self->parse_values($1);
  65.   }
  66.  
  67.   if($def !~ /^\s*$/)
  68.   {
  69.     GtkDefs::error("Unhandled enum def ($def) in $$self{module}\::$$self{type}\n")
  70.   }
  71.  
  72.   # this should never happen
  73.   warn if(scalar(@{$$self{elem_names}}) != scalar(@{$$self{elem_values}}));
  74.  
  75.   return $self;
  76. }
  77.  
  78. sub parse_values($$)
  79. {
  80.   my ($self, $value) = @_;
  81.  
  82.   # break up the value statements
  83.   foreach(split(/\s*'*[()]\s*/, $value))
  84.   {
  85.     next if($_ eq "");
  86.  
  87.     if(/^"\S+" "(\S+)" "([^"]+)"$/)
  88.     {
  89.       my ($name, $value) = ($1, $2);
  90.  
  91.       # cut off the module prefix, e.g. GTK_
  92.       $name =~ s/^[^_]+_//;
  93.  
  94.       push(@{$$self{elem_names}}, $name);
  95.       push(@{$$self{elem_values}}, $value);
  96.     }
  97.     else
  98.     {
  99.       GtkDefs::error("Unknown value statement ($_) in $$self{c_type}\n");
  100.     }
  101.   }
  102. }
  103.  
  104. sub beautify_values($)
  105. {
  106.   my ($self) = @_;
  107.  
  108.   return if($$self{flags});
  109.  
  110.   my $elem_names  = $$self{elem_names};
  111.   my $elem_values = $$self{elem_values};
  112.  
  113.   my $num_elements = scalar(@$elem_values);
  114.   return if($num_elements == 0);
  115.  
  116.   my $first = $$elem_values[0];
  117.   return if($first !~ /^-?[0-9]+$/);
  118.  
  119.   my $prev = $first;
  120.  
  121.   # Continuous?  (Aliases to prior enum values are allowed.)
  122.   foreach my $value (@$elem_values)
  123.   {
  124.     return if(($value < $first) || ($value > $prev + 1));
  125.     $prev = $value;
  126.   }
  127.  
  128.   # This point is reached only if the values are a continuous range.
  129.   # 1) Let's kill all the superfluous values, for better readability.
  130.   # 2) Substitute aliases to prior enum values.
  131.  
  132.   my %aliases = ();
  133.  
  134.   for(my $i = 0; $i < $num_elements; ++$i)
  135.   {
  136.     my $value = \$$elem_values[$i];
  137.     my $alias = \$aliases{$$value};
  138.  
  139.     if(defined($$alias))
  140.     {
  141.       $$value = $$alias;
  142.     }
  143.     else
  144.     {
  145.       $$alias = $$elem_names[$i];
  146.       $$value = "" unless($first != 0 && $$value == $first);
  147.     }
  148.   }
  149. }
  150.  
  151. sub build_element_list($$$$)
  152. {
  153.   my ($self, $ref_flags, $ref_no_gtype, $indent) = @_;
  154.  
  155.   my @subst_in  = [];
  156.   my @subst_out = [];
  157.  
  158.   # Build a list of custom substitutions, and recognize some flags too.
  159.  
  160.   foreach(@$ref_flags)
  161.   {
  162.     if(/^\s*(NO_GTYPE)\s*$/)
  163.     {
  164.       $$ref_no_gtype = $1;
  165.     }
  166.     elsif(/^\s*(get_type_func=)(\s*)\s*$/)
  167.     {
  168.       my $part1 = $1;
  169.       my $part2 = $2;
  170.     }
  171.     elsif(/^\s*s#([^#]+)#([^#]*)#\s*$/)
  172.     {
  173.       push(@subst_in,  $1);
  174.       push(@subst_out, $2);
  175.     }
  176.     elsif($_ !~ /^\s*$/)
  177.     {
  178.       return undef;
  179.     }
  180.   }
  181.  
  182.   my $elem_names  = $$self{elem_names};
  183.   my $elem_values = $$self{elem_values};
  184.  
  185.   my $num_elements = scalar(@$elem_names);
  186.   my $elements = "";
  187.  
  188.   for(my $i = 0; $i < $num_elements; ++$i)
  189.   {
  190.     my $name  = $$elem_names[$i];
  191.     my $value = $$elem_values[$i];
  192.  
  193.     for(my $ii = 0; $ii < scalar(@subst_in); ++$ii)
  194.     {
  195.       $name  =~ s/${subst_in[$ii]}/${subst_out[$ii]}/;
  196.       $value =~ s/${subst_in[$ii]}/${subst_out[$ii]}/;
  197.     }
  198.  
  199.     $elements .= "${indent}${name}";
  200.     $elements .= " = ${value}" if($value ne "");
  201.     $elements .= ",\n" if($i < $num_elements - 1);
  202.   }
  203.  
  204.   return $elements;
  205. }
  206.  
  207. sub dump($)
  208. {
  209.   my ($self) = @_;
  210.  
  211.   print "<enum module=\"$$self{module}\" type=\"$$self{type}\" flags=$$self{flags}>\n";
  212.  
  213.   my $elem_names  = $$self{elem_names};
  214.   my $elem_values = $$self{elem_values};
  215.  
  216.   for(my $i = 0; $i < scalar(@$elem_names); ++$i)
  217.   {
  218.     print "  <element name=\"$$elem_names[$i]\"  value=\"$$elem_values[$i]\"/>\n";
  219.   }
  220.  
  221.   print "</enum>\n\n";
  222. }
  223.  
  224. 1; # indicate proper module load.
  225.